<?php

namespace Crm\Controller;

/**
 * 应用基类控制器
 *
 * @author SoChishun
 * @since 1.0 <2015-3-18> by SoChishun Added.
 */
abstract class AppbaseController extends \Common\Controller\CommonController {

    /**
     * 空操作，用于输出404页面
     * @since 1.0 <2015-3-23> SoChishun Added.
     */
    public function _empty() {
        layout(false);
        $this->display('XPage/404');
    }

    public function _initialize() {
        appfn_is_install() || redirect(U('Install/index'));
        // 用户登录检测
        ($this->user_login_data = appfn_is_login(C('USER.SESSION_ID'))) || redirect(U('Login/index'));
        // 站点是否关闭检测
        !C('WEB_SITE_CLOSE') || $this->error('站点已经关闭，请稍后访问~');

        $this->app_assign();
    }

    /**
     * 应用全局赋值操作
     * @since 1.0 <2015-3-23> SoChishun Added.
     */
    function app_assign() {
        // 用户登录资料
        $this->assign('login_data', $this->user_login_data);
        // 用户主菜单权限
        $this->assign('main_nav', D('Permission')->get_main_nav($this->user_login_data['role_id']));
        // 浏览历史
        $this->assign('visit_history', D('SysHistory')->get_visit_history($this->user_login_data['id']));
    }

    /**
     * 显示列表视图页面
     * @param string $tpl 列表部分模板文件路径, 如：user_list_table.html
     * @since 1.0 <2015-3-24> SoChishun Added.
     */
    public function display_tpp($tpl = '') {
        layout(false);
        // 列表模板
        if (!$tpl) {
            $tpl = ACTION_NAME . '_table';
        }
        $this->assign('list_content', $this->fetch($tpl));
        layout(true);
        $this->display();
    }

    /**
     * 提示并跳转返回
     * @param array $result array('status'=>false,'info'=>'消息')
     * @param string $url 地址或action_name
     * @since 1.0 <2015-3-25> SoChishun Added.
     * @example 
     *      base_redirect_return($result,'user_list');
     *      base_redirect_return($result,U('User/user_list');
     */
    protected function base_redirect_return($result, $url) {
        layout(false);
        if ($result['status']) {
            if (false === strpos($url, '/')) {
                $url = U(CONTROLLER_NAME . '/' . $url); // $url=action_name
            }
            $this->success((empty($result['info']) || is_numeric($result['info'])) ? '保存成功' : $result['info'], $url);
        } else {
            // 自动根据消息长度设定跳转时间,防止跳转太快没看清消息 2015-3-30 SoChishun Added.
            $sec = 3;
            if (is_array($result['info'])) {
                $info = implode('<br />', $result['info']);
                $sec += count($result['info']);
            } else {
                $info = $result['info'];
            }
            $this->error($info, '', $sec);
        }
        exit;
    }

    /**
     * 通用添加访问历史的方法
     * @param string $title 标题
     * @param false|array $breadcrumb 导航栏, 如array('管理员管理'=>U('Admin/admin_list'),默认自动生成,false则不自动生成
     * @since 1.0 <2015-3-26> SoChishun Added.
     * @since 1.1 <2015-4-3> SoChishun 新增$breadcrumb
     */
    protected function base_common_add_visit_history($title, $breadcrumb = array()) {
        D('SysHistory')->add_visit_history($this->user_login_data['id'], $title, __SELF__);
        if (!$breadcrumb && false !== $breadcrumb && (false !== strpos($title, '新增') || false !== strpos($title, '编辑'))) {
            $breadcrumb = array(sofn_msubstr($title, 2, null) . '管理' => str_replace('_edit', '_list', __SELF__));
        }
        $str_breadcrumb = '<div class="breadcrumb"><ul>';
        $str_breadcrumb.='<li><a href="' . U('Index/index') . '">首页</a></li>';
        if ($breadcrumb) {
            foreach ($breadcrumb as $til => $url) {
                $str_breadcrumb.='<li><a href="' . $url . '">' . $til . '</a></li>';
            }
        }
        $str_breadcrumb.='<li><a href="' . __SELF__ . '">' . $title . '</a></li>';
        $str_breadcrumb.='</ul></div>';
        $this->assign('_breadcrumb', $str_breadcrumb);
        $this->assign('meta_title', $title);
    }

    /**
     * 通用编辑视图方法
     * @param int $id 主键编号
     * @param string $model 模型名称
     * @since 1.0 <2015-3-25> SoChishun Added.
     */
    protected function base_common_edit_view($id, $model) {
        if ($id) {
            $this->assign('data', D($model)->find($id));
        }
        $this->display();
    }

    /**
     * 通用删除方法
     * @param int $id 主键编号
     * @param string $model 模型名称
     * @since 1.0 <2015-3-25> SoChishun Added.
     */
    protected function base_common_delete($id, $model) {
        if (!$id) {
            $this->ajaxReturn(array('result' => false, '参数有误'));
        }
        // 是否需要判断有误关联数据,如未结账款等
        $result = D($model)->delete($id);
        if (false === $result) {
            $this->error(D($model)->getDbError());
        } else {
            $this->success('删除成功');
        }
    }

    /**
     * 通用TreeTable操作
     * 用于Role,Permission,Category等模型
     * @param string $title 标题,如：角色
     * @param string $model 模型名称,如：Role
     * @since 1.0.0 <2015-3-25> SoChishun Added.
     */
    public function base_common_treetable_list($title, $model) {
        $this->base_common_add_visit_history($title . '管理');
        $list = D($model)->get_tree_list('treetable');
        $this->assign('list', $list);
        layout(false);
        // 列表模板
        $this->assign('list_content', $this->fetch(ACTION_NAME . '_table'));
        layout(true);
        $this->display();
    }

    /**
     * 通用TreeTable编辑操作
     * 用于Role,Permission,Category等模型
     * @param string $title 标题,如：角色
     * @param string $model 模型名称,如：Role
     * @param int $id 主键编号
     * @param string|false $scope_treetable 父级树形数据源的scope,false=不设置,一般为treeselect或treetable
     * @since 1.0.0 <2015-3-28> SoChishun Added.
     */
    public function base_common_treetable_edit($title, $model, $id = 0, $scope_treetable = '') {
        $this->base_common_add_visit_history(($id ? '编辑' : '新增') . $title);
        // 树形列表
        if (false !== $scope_treetable) {
            $this->assign('ds_treeselect', D($model)->get_tree_list($scope_treetable));
        }
        if ($id) {
            $this->assign('data', D($model)->find($id));
        }
        $this->display();
    }

    /**
     * 通用TreeTable编辑保存操作
     * 用于Role,Permission,Category等模型
     * @param string $model 模型名称,如：Role
     * @param string $succ_tpl 成功后跳转的链接地址
     * @since 1.0 <2015-3-28> SoChishun Added.
     */
    public function base_common_treetable_edit_save($model, $succ_tpl = '') {
        $result = D($model)->save_item();
        $this->base_redirect_return($result, $succ_tpl ? $succ_tpl : U($model . '/' . strtolower($model) . '_list'));
    }

    /**
     * 断言用户权限
     * @param string $rule 规则名称,如 admin_list, admin_edit
     * @return boolean
     * @since 1.0 <2015-3-25> SoChishun Added.
     */
    abstract function assert_upr($rule = '');
}
